#pragma once

#include <iostream>
#include <string>
#include "util.hpp"

namespace ns_log{
    
    using namespace ns_util;

    enum{//枚举
        INFO, //信息级别，调试级别，警告级别，错误级别，致命级别
        DEBUG,
        WARNING,
        ERROR,
        FATAL
    }

    inline std::ostream &Log(const std::string &level, const std::string &file_name, int line)
    {//用于快速记录带有日志级别、文件名和行号的日志信息，并返回流对象以便链式调用。
    //链式调用是连续调用同一个对象的方法，每个方法返回对象本身，从而可以无缝地继续调用下一个方法
        // 添加日志等级
        std::string message = "[";
        message += level;
        message += "]";

        // 添加报错文件名称
        message += "[";
        message += file_name;
        message += "]";

        // 添加报错行
        message += "[";
        message += std::to_string(line);//将 line 转换为字符串并追加到 message 字符串的末尾
        message += "]";

        // 日志时间戳
        message += "[";
        message += TimeUtil::GetTimeStamp();//获取当前的时间戳
        message += "]";

        // cout 本质 内部是包含缓冲区的
        std::cout << message; //不要endl进行刷新

        return std::cout;//尝试返回输出流对象，为了链式调用或误用
    }
    //定义一个宏，用于记录日志，自动包含日志级别、文件名和行号。
    #define LOG(level) Log(#level, __FILE__, __LINE__)
    //LOG(level) 的作用是在代码中插入一个日志记录点
}